#ifndef FT6336U_H
#define FT6336U_H

#include <stdbool.h>
#include <stdint.h>

#define FT6336U_REGTD_STATUS 0x02 // 触摸点个数 ，最大支持两个

// 第一个触摸点
#define FT6336U_REG_P1_XH 0x03 // bit7-bit6为第1点触摸事件标志，bit3-bit0为第1点的X坐标高4位
#define FT6336U_REG_P1_XL 0x04 // 第1点的X坐标低8位
#define FT6336U_REG_P1_YH 0x05 // bit7-bit6为第1点触摸事件标志，bit3-bit0为第1点的X坐标高4位
#define FT6336U_REG_P1_YL 0x06 // 第1点的Y坐标低8位

// 第二个触摸点
#define FT6336U_REG_P2_XH 0x09 // bit7-bit6为第1点触摸事件标志，bit3-bit0为第1点的X坐标高4位
#define FT6336U_REG_P2_XL 0x0A // 第1点的X坐标低8位
#define FT6336U_REG_P2_YH 0x0B // bit7-bit6为第1点触摸事件标志，bit3-bit0为第1点的X坐标高4位
#define FT6336U_REG_P2_YL 0x0C // 第1点的Y坐标低8位

#define FT6336U_REG_ID_G_FACE_DEC_MODE 0xB0 // 近距离感应使能
#define FT6336U_REG_ID_G_CIPHER_HIGH   0xA3 // 芯片代号寄存器[23:16]
#define FT6336U_REG_ID_G_CIPHER_MIDE   0x9F // 芯片代号寄存器[15:8]
#define FT6336U_REG_ID_G_CIPHER_LOW    0xA0 // 芯片代号寄存器[7:0]
#define FT6336U_REG_ID_G_LIB_VERSION_H 0xA1 // 库文件版本寄存器[15:8]
#define FT6336U_REG_ID_G_LIB_VERSION_L 0xA2 // 库文件版本寄存器[7:0]
#define FT6336U_REG_ID_G_FIRMID        0xA6 // 固件版本寄存器
#define FT6336U_REG_ID_G_FOCALTECH_ID  0xA8 // VENDOR_ID寄存器

#define FT6336U_GESTURE_NONE       0x00
#define FT6336U_GESTURE_SLIDEDOWN  0x01
#define FT6336U_GESTURE_SLIDEUP    0x02
#define FT6336U_GESTURE_SLIDELEFT  0x03
#define FT6336U_GESTURE_SLIDERIGHT 0x04
#define FT6336U_GESTURE_SINGLETAP  0x05
#define FT6336U_GESTURE_DOUBLETAP  0x0B
#define FT6336U_GESTURE_LONGPRESS  0x0C

#define FT6336U_GESTURE_STR(v)                                \
	(v == FT6336U_GESTURE_NONE)             ? "NONE"      \
	    : (v == FT6336U_GESTURE_SLIDEUP)    ? "UP"        \
	    : (v == FT6336U_GESTURE_SLIDEDOWN)  ? "DOWN"      \
	    : (v == FT6336U_GESTURE_SLIDELEFT)  ? "LEFT"      \
	    : (v == FT6336U_GESTURE_SLIDERIGHT) ? "RIGHT"     \
	    : (v == FT6336U_GESTURE_SINGLETAP)  ? "SINGLE"    \
	    : (v == FT6336U_GESTURE_DOUBLETAP)  ? "DOUBLE"    \
	    : (v == FT6336U_GESTURE_LONGPRESS)  ? "LONGPRESS" \
	                                        : "UNKNOW"

#define FT6336U_I2C_7BIT_ADDR 0x38

#ifndef LOW
#define LOW 0
#endif

#ifndef HIGH
#define HIGH 1
#endif

/**
 * @brief CST916D
 */
struct ft6336u {
	struct {
		// 固定参数指受物理因素限制的参数，无法修改的值
		struct {
			int width;
			int height;
			uint8_t slave_address;
		} fix;
		// 可变参数指的是可以根据使用场景指定的参数值
		struct {
			int dummy;
		} var;
	} cfg;
	struct {
		int (*read)(uint8_t reg, uint8_t* bytes, uint32_t len);
		int (*write)(uint8_t reg, uint8_t* bytes, uint32_t len);
		void (*msleep)(int ms);
		void (*reset)(int val);
	} ops;
};

int ft6336u_init(struct ft6336u* tp);
void ft6336u_deinit(struct ft6336u* tp);
int ft6336u_get_info(struct ft6336u* tp, uint32_t* chip, uint8_t* firmware, uint8_t* vendor, uint16_t* version);
int ft6336u_get_coord(struct ft6336u* tp, uint8_t* n, uint16_t* x, uint16_t* y);

#endif
